notebook: Protect removal-from-within
authorMatthias Clasen <mclasen@redhat.com>
Fri, 30 Jan 2015 14:26:04 +0000 (09:26 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 30 Jan 2015 15:13:28 +0000 (10:13 -0500)
When a tab is dropped, we have to remove it from the notebook to
insert it elsewhere. This is expected part of the tab dnd operation,
and we need to differentiate it from 'spontaneous' removals which
cause us to cancel the drag operation.

gtk/gtknotebook.c

index aba3daa12346627b91e6b00e1c2b0da61469d8c5..3953eececf01e2e1501f154a847451d789c855d7 100644 (file)
@@ -162,6 +162,7 @@ struct _GtkNotebookPrivate
   guint          click_child        : 3;
   guint          during_detach      : 1;
   guint          during_reorder     : 1;
+  guint          remove_in_detach   : 1;
   guint          focus_out          : 1; /* Flag used by ::move-focus-out implementation */
   guint          has_scrolled       : 1;
   guint          in_child           : 3;
@@ -3958,7 +3959,9 @@ do_detach_tab (GtkNotebook     *from,
                            "detachable", &detachable,
                            NULL);
 
+  from->priv->remove_in_detach = TRUE;
   gtk_container_remove (GTK_CONTAINER (from), child);
+  from->priv->remove_in_detach = FALSE;
 
   gtk_widget_get_allocation (GTK_WIDGET (to), &to_allocation);
   to_priv->mouse_x = x + to_allocation.x;
@@ -5048,7 +5051,7 @@ gtk_notebook_real_remove (GtkNotebook *notebook,
       priv->cur_page = NULL;
       if (next_list && !destroying)
         gtk_notebook_switch_page (notebook, GTK_NOTEBOOK_PAGE (next_list));
-      if (priv->operation == DRAG_OPERATION_REORDER)
+      if (priv->operation == DRAG_OPERATION_REORDER && !priv->remove_in_detach)
         gtk_notebook_stop_reorder (notebook);
     }
 
@@ -5056,7 +5059,7 @@ gtk_notebook_real_remove (GtkNotebook *notebook,
     {
       priv->detached_tab = NULL;
 
-      if (priv->operation == DRAG_OPERATION_DETACH)
+      if (priv->operation == DRAG_OPERATION_DETACH && !priv->remove_in_detach)
         {
           GdkDragContext *context;